package com.Sake.common.utils.ip;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.springframework.stereotype.Component;

import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Component
public class DateUtils {

    /**
     * 获得的是自1970-1-01 00:00:00.000 到当前时刻的时间距离
     *
     * @return long
     */
    public long getCurrentDate() {
        return System.currentTimeMillis();
    }

    /**
     * 获得今天零点的时间戳
     *
     * @return long
     */
    public Long getTodayZeroPointTimestamps() {
        Long currentTimestamps = System.currentTimeMillis();
        Long oneDayTimestamps = Long.valueOf(60 * 60 * 24 * 1000);
        return currentTimestamps - (currentTimestamps + 60 * 60 * 8 * 1000) % oneDayTimestamps;
    }

    /**
     * 获取当天最后时刻的时间戳
     * @return
     */
    public Long getTodayLastTimestamps(){
        long current=System.currentTimeMillis();    //当前时间毫秒数
        long zeroT=current/(1000*3600*24)*(1000*3600*24)- TimeZone.getDefault().getRawOffset();  //今天零点零分零秒的毫秒数
        Long endT=zeroT+24*60*60*1000-1;  //今天23点59分59秒的毫秒数
        return endT;
    }

    /**
     * 获得给定时间的零点的时间戳
     *
     * @return long
     */
    public Long getdayZeroPointTimestamps(Long currentTimestamps) {
        Long oneDayTimestamps = Long.valueOf(60 * 60 * 24 * 1000);
        return currentTimestamps - (currentTimestamps + 60 * 60 * 8 * 1000) % oneDayTimestamps;
    }

    /**
     * 获取给定日期最后时刻的时间戳
     * @return
     */
    public Long getdayLastTimestamps(Long current){
        long zeroT=current/(1000*3600*24)*(1000*3600*24)- TimeZone.getDefault().getRawOffset();  //今天零点零分零秒的毫秒数
        Long endT=zeroT+48*60*60*1000-1;  //今天23点59分59秒的毫秒数
        return endT;
    }

    /**
     * 根据当前时间获得今天零点的时间戳
     *
     * @return long
     */
    public Long getTodayZeroPointTimestampsByCurrentDate(Long currentTimestamps) {
        Long oneDayTimestamps = Long.valueOf(60 * 60 * 24 * 1000);
        return currentTimestamps - (currentTimestamps + 60 * 60 * 8 * 1000) % oneDayTimestamps;
    }

    /**
     * 时间戳转换为年月日
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMD(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }


    /**
     * 时间戳转换为年月日
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMD3(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 时间戳转换为月日
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToMD(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 时间戳转换为日
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToD(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("dd日");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 时间戳转换为年月日
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMD2(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 时间戳转换为年月日
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMDByChina(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 获取当月的天数
     */
    public int getCurrentMonthDay() {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }

    /**
     * 时间戳转换为年月日 23:59:59
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String getTodayEndYMDHMS(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 获取几分钟之后的起始时间和几天后的结束时间
     *
     * @param timeStamp
     * @param day
     * @param minute
     * @return
     * @throws Exception
     */
    public Map startTimeAndEndDate(Long timeStamp, int day, int minute) throws Exception {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //获取当天的年月日 时间戳转换成时间
        String ymd = sdf.format(new Date((timeStamp)));
        Date startDate = sdf.parse(ymd);
        Long startTimeStamp = startDate.getTime() + 1000 * minute * 60;
        Long endTimeStamp = (startTimeStamp + day * 86400000);
        Map<String, Long> timeMap = new HashMap<>(16);
        timeMap.put("startDate", startTimeStamp);
        timeMap.put("endDate", endTimeStamp);
        return timeMap;
    }


    /**
     * 时间戳转换为年月日时分秒
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMDHMS(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }


    /**
     * 时间戳转换为年月日时分秒
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMDHMS2(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 时间戳转换为年月日时分秒
     *
     * @param timeStamp 时间戳
     * @return
     */
    public static String timeStampToYMDHMS1(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }


    /**
     * 时间戳转换为年月日时分
     *
     * @param timeStamp 时间戳
     * @return
     */
    public String timeStampToYMDHM(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * 年月日转换为时间戳
     *
     * @param date 时间 yyyy-MM-dd
     * @return
     */
    public Long ymdToTimeStamp(String date) throws Exception {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 时间戳转换成时间
        Date date2 = sdf.parse(date);
        return date2.getTime();

    }

    /**
     * 年月日转换为时间戳
     *
     * @param date 时间 yyyy-MM-dd
     * @return
     */
    public Long ymdToTimeStampChina(String date) throws Exception {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        // 时间戳转换成时间
        Date date2 = sdf.parse(date);
        return date2.getTime();

    }

    /**
     * 年月日时分秒转换为时间戳
     *
     * @param date 时间 yyyy-MM-dd
     * @return
     */
    public Long ymdhmsToTimeStamp(String date) throws Exception {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 时间戳转换成时间
        Date date2 = sdf.parse(date);
        return date2.getTime();

    }

    /**
     * 获取N 天后的时间戳
     *
     * @param day 几天
     * @return
     */
    public Long getYMDToTimeStamp(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, day);
        return calendar.getTimeInMillis();
    }

    /**
     * 得到几天前的时间
     *
     * @param day
     * @return
     */
    public Long getDateBefore(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - day);
        return calendar.getTimeInMillis();
    }

    /**
     * 秒转换时分秒
     *
     * @param time 秒
     * @return
     */
    public String getSecondToHMS(int time) throws Exception {
        int hour = time / 3600;
        int minute = time / 60 % 60;
        int second = time % 60;
        String hms = hour + "时" + minute + "分" + second + "秒";
        return hms;
    }

    /**
     * 获取n 分钟后的时间戳
     *
     * @param minute 分钟
     * @return
     */
    public Long getLateMinute(int minute) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MINUTE, minute);
        return calendar.getTimeInMillis();
    }

    /**
     * 获取几年后的时间戳
     *
     * @param Year 几年
     * @return
     */
    public Long getYMDToYearTimeStamp(int Year) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.YEAR, Year);
        return calendar.getTimeInMillis();
    }

    /**
     * 获取两个月后的时间戳
     *
     * @param date 开始时间
     * @return
     */
    public Long getYMDToMonthTimeStamp(Long date) {
        Calendar calendar = Calendar.getInstance();
        Date dt = new Date();
        dt.setTime(date);
        calendar.setTime(dt);
        calendar.add(Calendar.MONTH, 2);
        return calendar.getTimeInMillis();
    }



    /**
     * 获取今年的时间戳
     *
     * @return
     */
    public Long getCurrentYearFirstDay() {
        Calendar calendar = Calendar.getInstance();// 获取当前日期
        calendar.add(Calendar.YEAR, 0);
        calendar.add(Calendar.DATE, 0);
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_YEAR, 1);
        calendar.set(Calendar.HOUR, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Long time = calendar.getTimeInMillis();
        return time;
    }

    /**
     * 获取当月月初一号0点时间戳
     *
     * @return
     */
    public Long getMonthBeginDate() {
        Calendar calendar = Calendar.getInstance();// 获取当前日期
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
        calendar.set(Calendar.HOUR_OF_DAY, 0);//时
        calendar.set(Calendar.MINUTE, 0);//分
        calendar.set(Calendar.SECOND, 0);//秒
        return calendar.getTimeInMillis();
    }

    /**
     * 获取当月每日指定时间戳
     *
     * @return
     */
    public Long getDayDate(Integer day,Integer hour,Integer minute,Integer second) {
        Calendar calendar = Calendar.getInstance();// 获取当前日期
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, day);// 设置为1号,当前日期既为本月第一天
        calendar.set(Calendar.HOUR_OF_DAY, hour);//时
        calendar.set(Calendar.MINUTE, minute);//分
        calendar.set(Calendar.SECOND, second);//秒
        return calendar.getTimeInMillis();
    }

    /**
     * 根据指定时间戳获取几个月后一号凌晨0点时间戳
     * @param now
     * @return
     */
    public Long getMonthBeginDateByTimestamp(Long now,Integer Month){
        Calendar calendar = Calendar.getInstance();// 获取当前日期
        Date date = new Date();
        date.setTime(now);
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, Month);
        calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
        calendar.set(Calendar.HOUR_OF_DAY, 0);//时
        calendar.set(Calendar.MINUTE, 0);//分
        calendar.set(Calendar.SECOND, 0);//秒
        return calendar.getTimeInMillis();
    }

    /**
     * 根据指定时间戳获取几个月后最后一天晚上23点59分59秒999毫秒的时间戳
     * @param now
     * @return
     */
    public Long getMonthEndDateByTimestamp(Long now,Integer Month){
        Calendar c = Calendar.getInstance();
        Date date = new Date();
        date.setTime(now);
        c.setTime(date);
        c.add(Calendar.MONTH, Month);
        //设置为当月最后一天
        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
        //将小时至23
        c.set(Calendar.HOUR_OF_DAY, 23);
        //将分钟至59
        c.set(Calendar.MINUTE, 59);
        //将秒至59
        c.set(Calendar.SECOND,59);
        //将毫秒至999
        c.set(Calendar.MILLISECOND, 999);
        // 获取本月最后一天的时间戳
        return c.getTimeInMillis();
    }

    /**
     *  获取给定月份月份天数
     * @return
     */
    public int getMonthDay(int year,int month) {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.YEAR, year);
        a.set(Calendar.MONTH, month - 1);
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }


    /**
     * @Description: 导出Excel
     * @param workbook
     * @param sheetNum (sheet的位置，0表示第一个表格中的第一个sheet)
     * @param sheetTitle  （sheet的名称）
     * @param headers    （表格的列标题）
     * @param result   （表格的数据）
     * @param out  （输出流）
     * @throws Exception
     */
    public static void exportExcel(HSSFWorkbook workbook, int sheetNum,
                                   String sheetTitle, String[] headers, List<List<String>> result,
                                   OutputStream out) throws Exception {
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet();
        workbook.setSheetName(sheetNum, sheetTitle);
        // 设置表格默认列宽度为20个字节
        sheet.setDefaultColumnWidth((short) 20);
        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
//        style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
        style.setFillForegroundColor(HSSFColor.HSSFColorPredefined.PALE_BLUE.getIndex());
        // 生成一个字体
        HSSFFont font = workbook.createFont();
        font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
        font.setFontHeightInPoints((short) 12);
        // 把字体应用到当前的样式
        style.setFont(font);

        // 指定当单元格内容显示不下时自动换行
        style.setWrapText(true);

        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell((short) i);

            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text.toString());
        }
        // 遍历集合数据，产生数据行
        if (result != null) {
            int index = 1;
            for (List<String> m : result) {
                row = sheet.createRow(index);
                int cellIndex = 0;
                for (String str : m) {
                    HSSFCell cell = row.createCell((short) cellIndex);
                    cell.setCellValue(str.toString());
                    cellIndex++;
                }
                index++;
            }
        }
    }

    /**
     * 时间戳转换为年月日时分
     *
     * @param timeStamp 时间戳
     * @return
     */
    public static String timeStampToYMDHMSTime(Long timeStamp) {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        // 时间戳转换成时间
        return sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
    }

    /**
     * utc时间字符串转成系统时间
     * @param utcTime utc时间字符串 格式 ->  yyyy-MM-dd HH:mm:ss
     * @return 系统时间Date对象
     */
    public static Date utcToLocal(String utcTime) throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date utcDate = null;
        try {
            utcDate = sdf.parse(utcTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        sdf.setTimeZone(TimeZone.getDefault());
        String localTime = sdf.format(utcDate.getTime());
        return sdf.parse(localTime);
    }

    /**
     * yyyy/MM/dd HH:mm:ss 时间字符串转化成时间戳
     * @param date
     * @return
     * @throws Exception
     */
    public static Long ymdhmsStrToTimeStamp(String date) throws Exception {
        //这个是你要转成后的时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        // 时间戳转换成时间
        Date date2 = sdf.parse(date);
        return date2.getTime();

    }

    private static  boolean flag = false;
    private static int i = 0;
    public static void main(String[] args) throws Exception {

        Long aLong = DateUtils.ymdhmsStrToTimeStamp("2020/11/5 19:56:18");
        System.out.println(aLong);
    }



}

